home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
17 Bit Software 3: The Continuation
/
17-Bit_The_Continuation_Disc.iso
/
amigan
/
amigan 17
/
qman
/
msmooth.asm
< prev
next >
Wrap
Assembly Source File
|
1994-01-27
|
6KB
|
149 lines
****************************************************************************
*
* Draws a Row of Pixels in Mandelbrot Set (with smoothing)
*
* C must set the following variables prior to call:
*
* xptr : pointer to table of x-values
* imagc : imaginary part of current pixel row
* bp1-4 : pointers to the four bit planes
*
* Integers are 2**26 times the actual values in the complex plane
*
****************************************************************************
* First some macros we will need.....
EvalPix MACRO
moveq #79,d3 set counter to 79
clr.l d0 zero out real_z
clr.l d2 zero out imag_z
repeat\1 moveq #13,d7 number of bits to shift
asr.l d7,d0 divide real_z by 2**13
asr.l d7,d2 divide imag_z by 2**13
move.l d0,d1 real_z
sub.w d2,d0 real_z - imag_z
add.w d1,d1 2 * real_z
muls d1,d2 2 * real_z * imag_z
sub.w d0,d1 real_z + imag_z
muls d1,d0 real_z**2 - imag_z**2
add.l d5,d0 add real_c to get new real_z
move.l d0,d7 create temp copy of real_z
bpl pos_1\1 if real_z positive, do nothing
neg.l d7 take absolute value of real_z
pos_1\1 add.l d6,d2 add imag_c to get new imag_z
move.l d2,d1 load working copy of imag_z
bpl pos_2\1 if imag_z positive, do nothing
neg.l d1 take absolute value of imag_z
pos_2\1 add.l d1,d7 d7 contains the norm of z
subq #1,d3 decrement counter by 1
beq pixout\1 if 79 iters, draw the pixel
subi.l #200000000,d7 reduce the norm by 200 million
bmi repeat\1 if z not exploding, continue
addq #1,d3 increment counter by 1
asr.l #3,d3 color is 1/8 number of iters
addq #3,d3 range 3 to 12
pixout\1 nop
ENDM
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
WritePix MACRO
tst.l d4 examine bit within byte
bne plane1\1 if not bit zero, poke planes
moveq #8,d4 reset to bit 8 (next will be 7)
lea 1(a0),a0 incr addr within 1st bit plane
lea 1(a1),a1 2nd
lea 1(a2),a2 3rd
lea 1(a3),a3 4th
plane1\1 subq.l #1,d4 decrement bit within byte by 1
nomenus\1 btst d4,(a0) if we've hit a menu-- STOP!
bne nomenus\1
btst d4,(a1)
bne nomenus\1
btst d4,(a2)
bne nomenus\1
btst d4,(a3)
bne nomenus\1
btst #0,d3 examine 1st bit of color
beq plane2\1 if bit off, leave screen alone
bset d4,(a0) turn current bit on in plane
plane2\1 btst #1,d3
beq plane3\1
bset d4,(a1)
plane3\1 btst #2,d3
beq plane4\1
bset d4,(a2)
plane4\1 btst #3,d3
beq writeout\1
bset d4,(a3)
writeout\1 nop
ENDM
*------------------------------------------*
* The main routine! *
*------------------------------------------*
XDEF _msmooth This tells C about us
SECTION text,code
_msmooth movem.l d2-d7/a2-a6,-(a7) save registers
setup moveq #8,d4 bit within screen byte
move.l #638,pixct pixel counter for current row
move.l _xptr,a5
move.l _imagc,d6
move.l _bp1,a0
move.l _bp2,a1
move.l _bp3,a2
move.l _bp4,a3
xloop move.l (a5),d5 move next x-value into D5
EvalPix 0 the i-th pixel
move.l d3,lastval
WritePix 0
adda #8,a5
move.l (a5),d5
EvalPix 2 the (i+2)nd pixel
move.l d3,nextval
suba #4,a5
cmp lastval,d3
beq nextpix
move.l (a5),d5
EvalPix 1 the (i+1)st pixel
nextpix WritePix 1
move.l nextval,d3
WritePix 2
adda #8,a5
next_x subi.l #3,pixct decrement x counter
bpl xloop if not done with row, continue
add.l #80,_bp1 advance to next display line
add.l #80,_bp2
add.l #80,_bp3
add.l #80,_bp4
movem.l (a7)+,d2-d7/a2-a6 restore registers
rts
SECTION udata,bss
XREF _xptr,_imagc
XREF _bp1,_bp2,_bp3,_bp4
pixct DS.L 1
lastval DS.L 1
nextval DS.L 1
END